// 构建脚本(build.rs) - 用于自定义Cargo构建过程

// 导入标准库中的环境变量模块
use std::env;
// 导入标准库中的文件系统操作模块
use std::fs;
// 导入标准库中的路径处理模块
use std::path::Path;

// 主函数 - Cargo在构建前会自动执行此函数
fn main() {
    // 告诉Cargo: 当src/lib.rs文件发生变化时，需要重新运行此构建脚本
    // println!("cargo:rerun-if-changed=src/lib.rs");

    // 获取目标名称
    let target_name = env::var("CARGO_TARGET_NAME").unwrap_or_default();
    if target_name.is_empty() {
        eprintln!("CARGO_TARGET_NAME is empty");
        return;
    }

    // 获取Cargo的目标目录路径，如果未设置则使用默认的"target"
    let target_dir = env::var("CARGO_TARGET_DIR").unwrap_or_else(|_| "target".to_string());
    if target_dir.is_empty() {
        eprintln!("CARGO_TARGET_DIR is empty");
        return;
    }

    let plugin_dir = env::var("CARGO_PLUGIN_DIR").unwrap();
    if plugin_dir.is_empty() {
        eprintln!("CARGO_PLUGIN_DIR is empty");
        return;
    }

    // 获取当前的构建配置(debug/release)
    let profile = env::var("PROFILE").unwrap();
    if profile.is_empty() {
        eprintln!("PROFILE is empty");
        return;
    }

    // 根据目标操作系统确定库文件名
    let filename: &str = if cfg!(target_os = "windows") {
        // Windows 动态库后缀
        &format!("{}.dll", target_name)
    } else if cfg!(target_os = "macos") {
        // macOS 动态库后缀
        &format!("lib{}.dylib", target_name)
    } else {
        // Linux/Unix 动态库后缀
        &format!("lib{}.so", target_name)
    };

    // 构建源库文件的完整路径 (target/[debug|release]/库文件名)
    let source_path = Path::new(&target_dir)
        .join(&profile) // 添加 debug 或 release 目录
        .join("deps") // 添加 debug 或 release 目录
        .join(filename); // 添加库文件名

    let plugin_dir = Path::new(&plugin_dir);

    // 构建目标文件的完整路径
    let dest_path = plugin_dir.join(filename);

    // 创建目标目录(如果不存在)，包含所有父目录
    if let Err(e) = fs::create_dir_all(plugin_dir) {
        // 如果创建目录失败，打印错误信息
        eprintln!("Failed to create directory: {}", e);
        return; // 退出构建脚本
    }

    // 将编译好的库文件从源路径复制到目标路径
    if let Err(e) = fs::copy(&source_path, &dest_path) {
        // 如果复制失败，打印错误信息
        eprintln!("Failed to copy library: {}", e);
    } else {
        // 复制成功，打印成功信息
        println!("Successfully copied to {:?}", dest_path);
    }

    println!(
        "panic -> {} {} {} {} {} {}",
        target_name,
        target_dir,
        profile,
        plugin_dir.to_str().unwrap_or("invalid UTF-8"),
        source_path.to_str().unwrap_or("Invalid UTF-8"),
        dest_path.to_str().unwrap_or("Invalid UTF-8"),
    );
}
